﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/**
 * 创建时间：2014/12/19 11:27:24
 * 作者：yong.blackcore
 * Email：itblackhole@outlook.com
 * QQ：50404503
 */
namespace ComicIsland.Common.Entities.ComicDatabase
{
    public class ModelBase : INotifyPropertyChanged, INotifyPropertyChanging
    {
        /// <summary>
        /// 实现 INotifyPropertyChanged 是为了属性变更后的通知
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        /// <summary>
        /// 实现 INotifyPropertyChanging 是为了最大限度地减少内存使用量（NotifyPropertyChanging 的用法：在属性赋值之前调用，具体可见 Category 或 Product）
        /// <para>为什么会减少内存使用量呢？</para>
        /// <para>因为 LINQ to SQL 更改跟踪是通过维护每个对象的两个副本进行工作的，第一个副本保存原始数据，第二个副本有程序更改，这样提交更新时 LINQ to SQL 就知道哪些数据被更改了，从而只提交这些被更改的数据</para>
        /// <para>INotifyPropertyChanging 接口允许应用程序在将修改后的数据提交到数据库前通知 DataContext，DataContext 可以将该通知用作创建副本的触发器，这样就不用保留第二个副本了，从而减少内存使用</para>
        /// </summary>
        public event PropertyChangingEventHandler PropertyChanging;
        protected void NotifyPropertyChanging(string propertyName)
        {
            if (PropertyChanging != null)
            {
                PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
            }
        }
    }
}
